概 述
URM13是一款开放式单探头超声波测距传感器,支持TRIG脉冲触发测距(兼容SR04)、UART和I2C,传感器可以在三种接口模式间无缝切换。该传感器尺寸紧凑、并且兼容如Arduino、树莓派等各种3.3V或5V主控板,非常方便用户集成和应用,UART模式使用标准Modbus-RTU协议并集成了收发控制输出,可简单通过外接RS485收发器扩展RS485接口。该传感器在保持同类传感器尺寸及重量优势的同时还具有非常出色的测距灵敏度,使得他对于一些低声波反射率的探测目标同样具备超越同类传感器的探测性能。URM13传感器会在每次测距时自动检测环境及电源噪声并以此来动态调节测量参数,确保它能在各种复杂应用场景之下依旧能够稳定工作。
为了满足不同的用户需求,URM13内置两段测距量程:
1、小量程15-150cm:可以实现高达50HZ的高频率探测,适用于室内机器人避障等场景。
2、大量程40-900cm:具有卓越的测量灵敏度,测量频率为常规10HZ,适用于空旷场景或需要高灵敏度、高量程距离探测的场景。
实际使用时,可通过重复触发2段量程的测距,以实现整个量程的检测。
技术参数
- 工作电压:3.3~5.5V DC
- 最大瞬时电流:350mA
- 有效量程:15cm ~ 900cm
- 距离分辨率:1cm
- 距离误差:±1%
- 温度分辨率:0.1℃
- 温度误差:±1℃
- 测量频率:10HZ
- 工作温度:-10℃~+70℃
- 工作湿度范围:RH<75%
- 传感器声学频率:40±1KHz
- 传感器方向角:60°(-6dB)
- 通信接口:I2C&TRIG/UART(Modbus-RTU)
接口及尺寸
- 尺寸示意图:
- 接口描述:
URM13可以在IIC、UART两种通信接口间任意切换,用户可以根据实际需求进行切换,并且传感器会保存已设置好的通信接口类型,下次使用时,不用再次设置。
接口引脚说明如下:
引脚 | 默认功能(UART) | 复用功能 (I2C) | 说明 |
---|---|---|---|
VCC | 电源正 | 电源正 | 3.3~5.5V |
GND | 电源地 | 电源地 | GND |
C/T | UART-TX | I2C-SCL | 传感器出厂默认为UART接口,若需要用I2C接口,参考模式切换。(端口模式为开漏,内部上拉6.2K电阻到VCC) |
D/R | UART-RX | I2C-SDA | 传感器出厂默认为UART接口,若需要用I2C接口,参考模式切换。(端口模式为开漏,内部上拉6.2K电阻到VCC) |
EN | 电源使能 | 电源使能 | 该引脚作为电源的使能脚,内部上拉,将EN拉低可以关断传感器电源,若不用此功能该引脚可以悬空不接。 |
BUSY | RS485收发控制口 | BUSY(开漏输出) | 在UART模式下,该引脚可作为RS485收发控制口,外接一个RS485的驱动IC即可扩展得到RS485接口。 在I2C模式下,测距过程中BUSY端口将拉低,BUSY脚输出高表示空闲或上一次测距已经完成。该引脚可接到主机的中断口,在BUSY端口输出电平上升沿时可以及时的读取到传感器数据。 |
TRIG | NC | TRIG | - UART接口下未使用 I2C接口下作为外部端口测距触发引脚,上升沿触发。 |
ECHO | NC | ECHO | - UART接口下未使用 I2C接口下,当传感器测距功能被触发后,该脚引输出一个高脉宽,此脉宽代表超声波传播时间(单位:us)。 |
板载LED灯状态指示
- 在传感器上电后,LED灯闪烁1次,表示当前传感器为UART模式,此模式下每收到一次正确的主机命令时LED会闪烁1次。
- 在传感器上电后,LED灯闪烁2次,表示当前传感器为I2C模式,此模式下测距时LED闪烁1次。
TRIG脉冲触发示例
准备
- 说明
使用此模式的驱动方式与SR04相同,在TRIG端口输入一个脉冲电平将触发传感器测距,测距完成后ECHO端口将输出一段脉冲电平,输出脉冲电平的宽度等于超声波的测量往返飞行时间。
需要特别说明一下:
1、TRIG模式下无法做量程切换,需要使用I2C接口配置或切换。
2、TRIG模式下输出的脉冲宽度未做温度补偿。
- 使用该模式前,请确认传感器为I2C模式,且为被动测距模式(I2C配置寄存器Bit2 = 1)
- 硬件
- 1 x Arduino Leonardo控制板
- 1 x USB数据线(USB数据线一端连接Arduino板USB口,另一端连接至电脑USB口)
- 软件
- Arduino IDE, 点击下载Arduino IDE
- 在IDE中打开Library Manager(Ctrl+Shift+I),搜索并安装DFRobot_URM13库
- 硬件接线示意图

-
时序图
-
基于库示例代码
- 示例代码(未使用库)

UART与I2C模式切换
URM13传感器默认出厂设置为UART模式。
传感器可以在I2C、UART两种模式间通过上电前短接不同的引脚实现简单的模式切换:
- 在传感器上电前,将TRIG与ECHO引脚短接,上电后LED闪烁2次,表示传感器已切换为I2C模式。
- 在传感器上电前,将TRIG与BUSY引脚短接,上电后LED闪烁1次,表示传感器已切换为UART模式。
在模式切换成功后,用户即可断开对应引脚的短接,切换后的模式将被传感器记录保存,永久生效。
UART寄存器说明
UART接口下,传感器为Modbus从机,主机需要通过Modbus协议与传感器进行通信。
地址 | 数量 | 名称 | 读写 | 数据范围 | 默认值 | 数据说明 |
---|---|---|---|---|---|---|
0x00 | 1 | 模块PID寄存器 | R | 0x0000-0xFFFF | 0x0003 | 该位用于产品校验[可实现模块类型的检测] |
0x01 | 1 | 模块VID寄存器 | R | 0x0000-0xFFFF | 0x0010 | 该位用于版本校验[0x0010表示V0.0.1.0] |
0x02 | 1 | 模块地址寄存器 | R/W | 0x0001-0x00F7 | 0x000D | [传感器地址未知时,可通过广播地址0x00做写入寄存器操作,此时传感器不会有数据输出] 断电保存,重启后生效 |
0x03 | 1 | 串口参数控制寄存器1 | R/W | 0x0000-0xFFFF | 0x0005 | 模块波特率 0x0001---2400 0x0003---9600 0x0004---14400 0x0005---19200 0x0006---38400 0x0007---57600 0x0008---115200 Other----115200 断电保存,重启后生效 |
0x04 | 1 | 串口参数控制寄存器2 | R/W | 0x0000-0xFFFF | 0x0001 | 模块校验位H 停止位L 0x00--无 0x00--0.5Byte 0x01--Even 0x01--1Byte 0x02--Odd 0x02--1.5Byte Other--无 0x03--2Byte Other--1Byte 断电保存,重启后生效 |
0x05 | 1 | 距离寄存器 | R | 0x0000-0xFFFF | 0xFFFF | 模块测得的距离值LSB代表1cm |
0x06 | 1 | 板载温度数据寄存器 | R | 0x0000-0xFFFF | 0x0000 | 板载温度传感器测得的温度数据LSB代表0.1摄氏度(有符号数) |
0x07 | 1 | 外部温度补偿数据寄存器 | R/W | 0x0000-0xFFFF | 0x0000 | 写入环境温度数据到该寄存器用于外部温度补偿LSB代表0.1摄氏度(有符号数) |
0x08 | 1 | 控制寄存器 | R/W | 0x0000-0xFFFF | 0x0004 | bit0 0-使用板载温度补偿功能 1-使用外部温度补偿功能(需用户写入温度数据至外部温度补偿数据寄存器) bit1 0-开启温度补偿功能 1-关闭温度补偿功能 bit2 0-自动测距 1-被动测距 bit3 被动模式下,向该位写入1,传感器将完成一次测距,测距完成后(约100ms)可从距离寄存器读出距离值,自动测距模式下该位保留。该位置1后将自动清0 bit4 0-大量程测距(40-900cm) 1-小量程测距(15-150cm) 断电保存,立即生效 |
0x09 | 1 | 电源噪声等级寄存器 | R | 0x0000-0x0A | 0x0000 | 0x0000-0x000A对应噪声等级0-10 该参数能够反映供电电源以及环境对传感器的影响程度。噪声等级越小,传感器得到的距离值将更精准。 |
0x0A | 1 | 测距灵敏度设置寄存器 | R/W | 0x0000-0x0A | 0x0000 | 0x0000-0x000A:灵敏度等级0-10 设置传感器大量程段(40-900cm)的测距灵敏度,该值越小,灵敏度越高 断电保存,立即生效 |
UART模式Arduino示例
准备
- 硬件
- 1 x Arduino Leonardo控制板
- 1 x USB数据线(USB数据线一端连接Arduino板USB口,另一端连接至电脑USB口)
- 软件
- Arduino IDE, 点击下载Arduino IDE
- 在IDE中打开Library Manager(Ctrl+Shift+I),搜索并安装DFRobot_URM13和DFRobot_RTU两个库
- 硬件接线示意图

基于库示例代码
基于Arduino串口发送命令示例代码

I2C寄存器说明
地址 | 名称 | 读写 | 数据范围 | 默认值 | 数据说明 |
---|---|---|---|---|---|
0x00 | 传感器地址寄存器 | R | 0x01-0xF7 | 0x12 | I2C从机地址 断电保存,重启后生效 |
0x01 | 传感器PID寄存器 | R | 0x00-0xFF | 0x02 | 该位用于产品校验[可实现传感器类型的检测] |
0x02 | 传感器VID寄存器 | R | 0x00-0xFF | 0x10 | 固件版本号:0x10代表V1.0 |
0x03 0x04 |
距离值寄存器高位 距离值寄存器低位 |
R R |
0x00-0xFF 0x00-0xFF |
0xFF 0xFF |
LSB为1cm,例:0x0064 = 100cm |
0x05 0x06 |
板载温度值寄存器高位 板载温度值寄存器低位 |
R R |
0x00-0xFF 0x00-0xFF |
0xFF 0xFF |
LSB代表0.1摄氏度,有符号数,例:读出的高位值 TEMP_H = 0x00,低位值TEMP_L = 0xfe,则实际测得的温度值为0x00fe / 10 = 25.4℃ |
0x07 0x08 |
外部温度补偿数据寄存器高位 外部温度补偿数据寄存器低位 |
R/W R/W |
0x00-0xFF 0x00-0xFF |
0x00 0x00 |
写入环境温度数据到该寄存器用于外部温度补偿,LSB代表0.1摄氏度(有符号数) |
0x09 | 配置寄存器 | R/W | 0x00-0xFF | 0x04 | bit5-bit7:保留 bit4(最大测量距离设置位): 0:大量程测距(40 - 900cm) 1:小量程测距(15-150cm) bit3:保留 bit2: 0:自动测量模式,模块一直在进行距离测量,并不断更新距离寄存器 1:被动测量,发送一次测距命令,模块测量一次距离并将测量的距离值存入距离寄存器 bit1: 0:温度补偿开启 1:关闭温度补偿 bit0: 0:使用板载温度补偿 1:使用外部温度补偿 断电保存,立即生效 |
0x0A | 命令寄存器 | R/W | 0x00-0xFF | 0x00 | bit7-bit6:保留 bit0: 向该位写1,触发一次测距,向该位写0被忽略 |
0x0B | 电源噪声等级寄存器 | R | 0x00-0x0A | 0x00 | 0x00-0x0A对应噪声等级0-10 该参数能够反映供电电源以及环境对传感器的影响程度。噪声等级越小,传感器得到的距离值将更精准。 |
0x0C | 测距灵敏度设置寄存器 | R/W | 0x00-0x0A | 0x00 | 0x00-0x0A:灵敏度等级0-10 用于设置传感器大量程段(40-900cm)的测距灵敏度,该值越小,灵敏度越高 断电保存,立即生效 |
I2C模式Arduino示例
###准备
- 硬件
- 1 x Arduino Leonardo控制板
- 1 x USB数据线(USB数据线一端连接Arduino板USB口,另一端连接至电脑USB口)
- 软件
- Arduino IDE, 点击下载Arduino IDE
- 在IDE中打开Library Manager(Ctrl+Shift+I),搜索并安装DFRobot_URM13库
- 硬件接线示意图

基于库示例代码
基于I2C接口读写寄存器示例代码

树莓派驱动库使用方法
镜像烧入
1.点击烧录系统详细操作步骤 。
远程连接(若不需要远程连接,有相关外围设备(屏幕键盘等)直接操作树莓派,则跳过此步骤。)
1.烧录系统详细操作步骤中:树莓派远程连接教程。如果有树莓派屏幕,那么应该可以轻松配置wifi连接并查看IP。没有屏幕也可通过我们官方wiki的图文流程学会如何连接wifi并查看IP。最后通过树莓派IP和完成远程连接,进入树莓派后台。
安装驱动
1.配置启动树莓派的I2C、UART接口。如已开启,可跳过该步骤。
- 打开终端(Terminal),键入如下指令,并回车:
pi@raspberrypi:~ $ sudo raspi-config
然后用上下键选择3 Interfacing Options
, 按回车进入,选择P5 I2C
, 按回车确认YES
即设置I2C使能。 - 再次用上下键选择
3 Interfacing Options
, 按回车进入,选择P6 Serial Port
, 按回车确认YES
即设置Serial Port使能。 - 最后重启树莓派主控板,使前面的使能配置生效:
pi@raspberrypi:~ $ sudo reboot
modbus使用的UART还需要额外配置一下,不然很可能通信不成功,可以作如下配置:
-
查看串口
pi@raspberrypi:~ $ ls -l /dev
在没有配置过正常情况下看到的应该是:
没有serial0,只有 serial1 -> ttyAMA0,启动串口(这一步我们前面通过raspi-config已经配置了)。pi@raspberrypi:~ $ sudo vi /boot/config.txt
在打开的文件后面添加:
#ENABLE UART
enable_uart=1
然后需要重启pi@raspberrypi:~ $ sudo reboot
在设置中启用串口后,会发现 /dev目录下变成了两个:
-
禁用蓝牙(硬件串口与mini串口默认映射对换)
pi@raspberrypi:~ $ sudo vi /boot/config.txt
在打开的文件后面添加:
dtoverlay=pi3-disable-bt
修改后需要重启:pi@raspberrypi:~ $ sudo reboot
(因为蓝牙也使用硬件串口,所以我们在 /boot/config.txt里面加上 dtoverlay=pi3-disable-bt ,ttyAMA0 得以释放,这时候树莓派也自动交换了ttyAMA0和ttyS0,把serial0 分配给了 ttyAMA0 。)
-
禁用串口的控制台功能,前面的步骤已经交换了硬件串口与mini串口的映射关系,但现在想使用树莓派外接串口模块进行通信还不行,因为树莓派IO引出的串口默认是用来做控制台使用的,它的初衷是为了在没有网络接口时,通过串口对树莓派进行相关的配置。因此需要禁用这个默认功能,使得串口为我们自由使用。在树莓派命令窗口中分别通过如下两个命令停止和禁用串口的控制台功能。由于我们前面已经交换了串口的映射关系,因此这里注意是ttyAMA0。
pi@raspberrypi:~ $ sudo systemctl stop serial-getty@ttyAMA0.service
pi@raspberrypi:~ $ sudo systemctl disable serial-getty@ttyAMA0.service
最后还需要删除一个东西:
pi@raspberrypi:~ $ sudo vi /boot/cmdline.txt
在打开的文件中删去 :console=serial0,115200
2.安装Python依赖库与git,树莓派需要联网。如已安装,可跳过该步骤。 -
在终端中,依次键入如下指令(更新所有东西;安装 build-essential、python-dev、python-smbus、git),并回车:
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get install build-essential python-dev python-smbus git
3.下载URM13驱动库及其依赖库。 -
在终端中,依次键入如下指令(安装modbus_tk库;切换文件目录到桌面;用git克隆下载驱动库到树莓派上),并回车:
使用python2则这样安装:pi@raspberrypi:~ $ pip install modbus_tk
使用python3则这样安装:pi@raspberrypi:~ $ pip3 install modbus_tk
pi@raspberrypi:~ $ cd Desktop/
pi@raspberrypi:~/Desktop $ git clone https://github.com/cdjq/DFRobot_URM13
运行示例代码
1.modbus接口测距示例(URM13_work_in_modbus.py)
- 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_URM13/python/raspberrypi/example
pi@raspberrypi:~/Desktop/DFRobot_URM13/python/raspberrypi/example $ python URM13_work_in_modbus.py
- 运行结果
2.I2C接口测距示例(URM13_work_in_I2C.py) - 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_URM13/python/raspberrypi/example
pi@raspberrypi:~/Desktop/DFRobot_URM13/python/raspberrypi/example $ python URM13_work_in_I2C.py
- 运行结果
3.TRIG接口测距示例(URM13_work_in_TRIG.py) - 在终端中,键入如下指令并回车,运行样例代码:
pi@raspberrypi:~/Desktop $ cd DFRobot_URM13/python/raspberrypi/example
pi@raspberrypi:~/Desktop/DFRobot_URM13/python/raspberrypi/example $ python URM13_work_in_TRIG.py
- 运行结果
探测角度及灵敏度说明
超声波传感器的物理特性决定了其实际具有不规则的探测区域,因此超声波测距传感器的探测角度难以被准确的定义。我们分别使用了2种参考目标障碍物对多样本产品进行了测试,对应目标的参照检测区域如下图示:
常见问题
1、如有疑问,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。